package slice

// Contains 判断Src 中是否包含 目标元素
func Contains[T comparable](src []T, dst T) bool {
	return ContainsFunc(src, func(src T) bool {
		return src == dst
	})
}

// ContainsFunc 判断Src 中是否包含目标元素, 第二个参数传入一个函数
func ContainsFunc[T comparable](src []T, equal func(src T) bool) bool {
	for _, v := range src {
		if equal(v) {
			return true
		}
	}
	return false
}

// ContainsAny  判断src里面是否存在dst中的每一个元素, 即dst是否是src的子集
func ContainsAny[T comparable](src, dst []T) bool {
	for _, valDst := range dst {
		if !Contains(src, valDst) {
			return false
		}
	}
	return true
}

// ContainsAnyFunc  判断src里面是否存在dst中的每一个元素, 即dst是否是src的子集
func ContainsAnyFunc[T comparable](src, dst []T, equal func(src, dst T) bool) bool {
	for _, valDst := range dst {
		if !ContainsFunc(src, func(src T) bool {
			return equal(src, valDst)
		}) {
			return false
		}
	}
	return true
}
